package com.nageoffer.shortlink.admin.toolkit;

import java.security.SecureRandom;

/**
 * 随机字符串工具类，生成包含数字和英文的6位随机字符串
 */
public final class RandomStringUtils {

    // 定义字符集：数字 + 大小写字母
    private static final String NUMBERS = "0123456789";
    private static final String LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    private static final String COMBINED = NUMBERS + LETTERS;
    private static final Integer LENGTH = 6;
    // 使用安全的随机数生成器
    private static final SecureRandom random = new SecureRandom();

    /**
     * 生成6位包含数字和英文的随机字符串
     * @return 6位随机字符串
     */
    public static String generateRandomString() {
        StringBuilder sb = new StringBuilder(LENGTH);

        // 确保至少包含1个数字和1个字母
        // 1. 先添加一个随机数字
        sb.append(NUMBERS.charAt(random.nextInt(NUMBERS.length())));
        // 2. 再添加一个随机字母
        sb.append(LETTERS.charAt(random.nextInt(LETTERS.length())));

        // 3. 填充剩余4位（从混合字符集中随机选取）
        for (int i = 2; i < 6; i++) {
            sb.append(COMBINED.charAt(random.nextInt(COMBINED.length())));
        }

        // 4. 打乱顺序，避免数字和字母固定在开头
        return shuffleString(sb.toString());
    }

    /**
     * 打乱字符串顺序
     * @param str 原始字符串
     * @return 打乱后的字符串
     */
    private static String shuffleString(String str) {
        char[] chars = str.toCharArray();
        for (int i = chars.length - 1; i > 0; i--) {
            int j = random.nextInt(i + 1);
            // 交换字符
            char temp = chars[i];
            chars[i] = chars[j];
            chars[j] = temp;
        }
        return new String(chars);
    }

}

